package Parser;

import Data.DbData;
import Enumeration.ParserInfo;
import Enumeration.ParserNames;
import Facade.ParserData;
import GUI.AObserver;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

/**
 * @author Martin
 * @version 1.0 @created 22-III-2012 16:32:27
 */
public class Parser extends AParser {

    private ParserData parserData;
    private DbData data;

    public Parser(ParserNames Name,ArrayList<AObserver> observers) {
        super(observers);
    }

    /**
     * Spouští parsování v jiném vláknu, ošetřit nutné čekání-> chyba, 5 min,
     * získání dat 1 hodina, jinak běží až do konec aplikace, před ukončením
     * aplikace ukončit i toto vlákno!!!
     *
     * @param parserData
     */
    @Override
    public void parse(ParserData mParserData) {
        this.parserData = mParserData;
        this.thread = new AParser.my_thread() {

            @Override
            public void run() {
                do {
                    List<Element> Elements_list = null;

                    // navázání spojení se serverem. Provede se 5 pokusů, poté označeno jako neúspěšné
                    int pokusu = 5;
                    do {
                        try {
                            Document doc = Jsoup.connect(parserData.getWwwPage()).timeout(3000).get();
                            Elements_list = doc.getElementsByTag("tbody");
                            pokusu = 0;
                            update("Povedlo se připojit k serveru\n");                            
                        } catch (IOException ex) {
                            pokusu--;
                        }
                    } while (pokusu > 0);


                    // v případě úspěšného spojení se serverem Elements_list obsahuje všechny tabulky na stránce (tag "tbody")
                    if (Elements_list == null) {   
                        // čekání po dobu 5 minut, poté nový pokus
                        for(int i=5;i>1;i--)
                        {                            
                            if(i==5){
                                update(ParserInfo.error.getText() + i + " minut");
                            }else{
                                update(ParserInfo.error.getText() + i + " minuty");
                            }
                            
                            try {
                                this.sleep(1000 * 60);      
                            } catch (InterruptedException ex) {
                                Logger.getLogger(Parser.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                        
                        for(int i=60;i>0;i-=10)
                        {
                            update(ParserInfo.error.getText() + i + " sekund");
                            try {
                                this.sleep(1000 * 10);      
                            } catch (InterruptedException ex) {
                                Logger.getLogger(Parser.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    } else {
                        update("Stahování dat...");
                        // potřebná data uložena v sedmé tabulce (Tabulka nemá jedinečný identifikátor). Načtení všech řádků tabulky do proměnné Element_list
                        Elements_list = Elements_list.get(7).getElementsByTag("tr");

                        SimpleDateFormat formatter;
                        Date date;
                        double flow;

                        formatter = new SimpleDateFormat("dd.MM.yyyy' 'HH:mm");

                        // procházení řádek po řádku, načítání obsahu a ukládání do DB
                        for (int i = 1; i < Elements_list.size(); i++) {
                            List<Element> pom = Elements_list.get(i).getAllElements();

                            try {
                                date = formatter.parse(pom.get(1).text());
                                flow = Double.parseDouble(pom.get(3).text());
                                data = new DbData(date, flow);

                                //předání proměnné data databázi pro uložení +testy  
                                //System.out.println(date.toString());
                                ruleDB.saveData(parserData.getPageRiver(),parserData.getPageStation(), data);
                                //ruleDB.getData(new Date(System.currentTimeMillis()-1000000000), new Date(System.currentTimeMillis()+100000000));
                                //System.out.println("-----------------");
                            } catch (ParseException ex) {
                                Logger.getLogger(Parser.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                        for(int i=50;i>0;i--)
                        {
                            if(i>4)
                            {update(ParserInfo.waiting.getText() + i + " minut");}
                            else if(i==1)
                            {update(ParserInfo.waiting.getText() + i + " minutu");}
                            else
                            {update(ParserInfo.waiting.getText() + i + " minuty");}
                            
                            try {                                
                                this.sleep(1000 * 60);
                            } catch (InterruptedException ex) {
                                Logger.getLogger(Parser.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                } while (true);
            }
        };
        
        thread.start();

    }
}